/*
 * Celda.cpp
 *
 *  Created on: Oct 26, 2013
 *      Author: javier
 */

#include "Celda.h"
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include "JsonLevel.h"

using Golosinas::Pieza;
using Golosinas::Button;
using Golosinas::GoldenStar;
using Golosinas::MiniBar;
using std::string;
using std::stringstream;

Celda::Celda(Pieza * p, CeldaBase * CeldaAnt) {
	this->miPieza = p;
	this->ptrCeldaAnt = CeldaAnt;
}

Celda::~Celda() {
	delete miPieza;
}

Pieza*  Celda::getGolosina(){
	return miPieza;
}

void Celda::reemplazarPieza(Pieza* p){
	miPieza = p;
}

void Celda::setGolosina(Pieza* p){
	miPieza = p;
}

bool Celda::operator ==(CeldaBase& c){
	if ((this->getGolosina() != NULL) && (c.getGolosina() != NULL)
			&& (this->getColorGolosina() != Pieza::dorado)){
		return (this->getColorGolosina() == c.getColorGolosina());
	}
	return false;
}

Pieza::color Celda::getColorGolosina(){
	return miPieza->getColor();
}

int Celda::eliminarContenido(){
	int temp = miPieza->getPuntos();
	delete miPieza;
	return temp;
}

bool Celda::intercambiarGolosina(CeldaBase& c){
	Pieza * tmp;
	tmp = c.getGolosina();
	//Si c no tiene golosinas, ya sea porque es una celdaVacia o porque esa
	//celda se quedo sin golosinas, no hago nada
	if (tmp == NULL){
		return false;
	}else if (this->getColorGolosina() != c.getColorGolosina() ||
			c.getColorGolosina() == Pieza::dorado){
		c.setGolosina(this->getGolosina());
		this->setGolosina(tmp);
		return true;
	}
	return false;
}

Pieza* Celda::darGolosina(int nCol){
	if (miPieza == NULL){
		miPieza = pedirGolosina(nCol);
	}
	return miPieza;
}

Pieza* Celda::pedirGolosina(int nCol){
	if (ptrCeldaAnt == NULL){
		return JsonLevel::getPiezaProb(nCol);
	} else {
		return ptrCeldaAnt->darGolosina(nCol);
	}
}

bool Celda::isVacia(){
	return false;
}

Json::Value Celda::toJson(){
	Json::Value book_json(Json::objectValue);
	book_json=getGolosina()->toJson();
	book_json["vacia"]=false;
	return book_json;
}
